# encoding: UTF-8

"""
该文件中包含的是交易平台的中间层，
将API和事件引擎包装到一个主引擎类中，便于管理。

当客户想采用服务器-客户机模式，实现交易功能放在托管机房，
而图形控制功能在本地电脑时，该主引擎负责实现远程通讯。
"""
import sys
from datetime import date
from time import sleep
from httpservice import *
from eventEngine import EventEngine


########################################################################
class MainEngine:
    """主引擎，负责对API的调度"""

    # ----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        self.eEngine = EventEngine()  # 创建事件驱动引擎
        self.httpapi = sinaAPI(self.eEngine)
        self.eEngine.start()  # 启动事件驱动引擎
        self.eEngine.register(EVENT_TIMER, self.initGet)
        # 循环查询持仓和账户相关
        self.countGet = 0  # 查询延时计数


    def initGet(self,event):
        # 开始循环查询
        self.httpapi.getMarketData()

    def exit(self):
        """退出"""
        # 销毁API对象
        self.td = None
        self.md = None
        # 停止事件驱动引擎
        self.eEngine.stop()
        self.httpapi.exit()



class sinaAPI(HttpAPI):
    def __init__(self, eventEngine):
        super(sinaAPI, self).__init__()
        #self.DEBUG = True
        # 事件引擎，所有数据都推送到其中，再由事件引擎进行分发
        self.__eventEngine = eventEngine
        # 请求编号，由api负责管理
        self.__reqid = 0

    def onRtnDepthMarketData(self, data, reqID):
        grep_detail = re.compile(r'(\w+)=([-\.\d:]+)' + r',([\.\d]+)' * 8 + r',(.*),' + r'([-\.\d:]+)')
        result = grep_detail.finditer(data)
        stock_dict = dict()
        for stock_match_object in result:
            stock = stock_match_object.groups()
            stock_dict[stock[0]] = dict(
                code = stock[0],
                name=stock[10],
                now=stock[3],  # 最新价
                open=stock[1],
                high=stock[4],  # 最高价
                low=stock[5],  # 最低价
                close=stock[3],
                preClose=stock[2],
                buy=stock[8],
                sell=stock[9],
            )
        event1 = Event(type_=EVENT_MARKETDATA)
        event1.dict_['data'] = stock_dict
        self.__eventEngine.put(event1)


